package com.example.crowdfunding.utils;
/*
 * @Author: hanj
 * @Email: hanj.cn@outlook.com
 * @Date: 2021/12/4 15:40
 */

/**
 * 统一整个项目中Ajax请求返回的结果，未来可以用来在分布式架构各个模块间调用时返回统一类型
 *
 * @param <T> 需要返回的数据
 */
public class ResultEntity<T> {

    /**
     * SUCCESS常量
     */
    public static final String SUCCESS = "SUCCESS";
    /**
     * FAILED常量
     */
    public static final String FAILED = "FAILED";

    //用来封装当前请求处理的结果
    private String result;

    //处理请求时，返回的提示信息（可选项）
    private String message;

    //返回的数据
    private T data;

    /**
     * 请求处理成功且不需要返回数据时的工具方法
     *
     * @param <Type>  需要返回的数据
     * @param message 提示信息
     * @return 封装了SUCCESS, message, null的ResultEntity
     */
    public static <Type> ResultEntity<Type> successWithoutData(String message) {

        return new ResultEntity<>(SUCCESS, message, null);
    }

    /**
     * 请求成功，并需要参数
     *
     * @param <Type>  需要返回的数据的类型
     * @param data    需要返回的数据
     * @param message 提示信息
     * @return 封装了SUCCESS, message, data的ResultEntity
     */
    public static <Type> ResultEntity<Type> successWithData(Type data, String message) {

        return new ResultEntity<>(SUCCESS, message, data);
    }

    /**
     * 请求失败，没有参数
     *
     * @param <Type>  需要返回的数据的类型
     * @param message 提示信息
     * @return 封装了FAILED, message, null的ResultEntity
     */
    public static <Type> ResultEntity<Type> failed(String message) {

        return new ResultEntity<>(FAILED, message, null);
    }

    /**
     * 构造器
     *
     * @param result  the result
     * @param message the message
     * @param data    the data
     */
    public ResultEntity(String result, String message, T data) {

        this.result = result;
        this.message = message;
        this.data = data;
    }

    @Override
    public String toString() {

        return "ResultEntity{" +
                "result='" + result + '\'' +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }

    /**
     * Gets result.
     *
     * @return the result
     */
    public String getResult() {

        return result;
    }

    /**
     * Sets result.
     *
     * @param result the result
     */
    public void setResult(String result) {

        this.result = result;
    }

    /**
     * Gets message.
     *
     * @return the message
     */
    public String getMessage() {

        return message;
    }

    /**
     * Sets message.
     *
     * @param message the message
     */
    public void setMessage(String message) {

        this.message = message;
    }

    /**
     * Gets data.
     *
     * @return the data
     */
    public T getData() {

        return data;
    }

    /**
     * Sets data.
     *
     * @param data the data
     */
    public void setData(T data) {

        this.data = data;
    }

    public ResultEntity() {

    }

}
